/*
 * @Description: 配置文件
 * @Author: DHL
 * @Date: 2021-12-03 15:20:09
 * @LastEditors: DHL
 * @LastEditTime: 2024-02-07 09:33:30
 */
import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'

export default defineConfig(({ command, mode, ssrBuild }) => {
  // 根据当前工作目录中的 `mode` 加载 .env 文件
  // 设置第三个参数为 '' 来加载所有环境变量，而不管是否有 `VITE_` 前缀。
  const env = loadEnv(mode, process.cwd(), '')

  const config = {
    plugins: createVitePlugins(env, command === 'build'),
    // vite 配置
    define: {
      __APP_ENV__: env.APP_ENV
    },
    // 这里是将src目录配置别名为 /@ 方便在项目中导入src目录下的文件
    resolve: {
      alias: {
        '@': path.resolve(process.cwd(), 'src')
      }
    },
    css: {
      preprocessorOptions: {
        scss: {
          api: 'modern-compiler'
        }
      }
    },
    build: {
      // 分包策略配置
      rollupOptions: {
        output: {
          // 分包策略
          manualChunks: {
            // 将Vue相关库打包在一起
            'vue-vendor': ['vue', 'vue-router', 'pinia'],
            // Element Plus单独打包
            'element-plus-vendor': ['element-plus', '@element-plus/icons-vue'],
            // 将体积较大的编辑器相关库单独打包
            'editor-vendor': ['@tinymce/tinymce-vue', 'tinymce'],
            // 将流程设计相关库单独打包
            'bpmn-vendor': [
              'bpmn-js',
              'bpmn-js-task-resize',
              'bpmn-js-token-simulation',
              'diagram-js',
              'diagram-js-minimap'
            ],
            // 将图表相关库单独打包
            'chart-vendor': ['echarts'],
            // 将工具库打包在一起
            'utils-vendor': ['lodash-es', 'dayjs', 'axios', 'qs']
          },
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'js/[name].[hash].js',
          // 用于命名代码拆分时创建的共享块的输出命名
          chunkFileNames: 'js/[name].[hash].js',
          // 用于输出静态资源的命名，[ext]表示文件扩展名
          assetFileNames: 'assets/[name].[hash].[ext]'
        }
      },
      // 设置分包大小阈值
      chunkSizeWarningLimit: 2000,
      // 启用gzip压缩
      reportCompressedSize: true,
      // 禁用生成map文件
      sourcemap: false,
      // 启用brotli压缩大小报告
      brotliSize: true
    }
  }

  if (command === 'serve') {
    Object.assign(config, {
      // dev 独有配置
      define: {
        // 开发环境下自动启用详细错误报告
        __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true
      },
      server: {
        proxy: {
          '/api': {
            target: env.VITE_APP_BASE_API_URL,
            changeOrigin: true,
            rewrite: (path) => path.replace(/^\/api/, '')
          }
        }
      }
    })
  } else {
    // command === 'build'

    Object.assign(config, {
      // build 独有配置
      target: 'modules',
      outDir: 'dist', //指定输出路径
      assetsDir: 'assets', // 指定生成静态资源的存放路径
      minify: 'terser' // 混淆器，terser构建后文件体积更小
    })
  }

  return config
})
